extends Skill




## 翻滚并强化下一次攻击
## 翻滚范围：1格
## 下一次攻击提升的攻击 1点
## [主动技能]

## 这个技能分两段
## 1是移动
## 2是回合内下一次攻击伤害增加

## 技能范围
var rang: int = 1 # 范围
var igs: Array = [Vector2(0, 0)] # 忽略指
var mode := CreateGrid.CREATE_GRID_MODE.CROSS # 范围模式

## 技能发动代价
var cost_ep: int = 3
var cost_move_chance: int = 1
var cost_action_chance: int = 1

## 技能目标位置
var target_position: Vector2 = Vector2.ZERO
## 技能段数，因为是两段所以用一个 bool 来表示
var phase: bool = false
var time: int = 0
## 技能提升伤害
var target_harm: Dictionary = {}
var harm_up: int = 1




func start(_args: Dictionary = {}) -> void:
	# 获取游戏场景
	var sce: Scene = get_scene()
	var off := sce.map.local_to_map(_args["user"].position)
	var pos := GCreateGrid.create_grid(mode, rang, igs, off)
	var lpos = []
	
	for index in range(0, pos.size()):
		lpos.append(sce.map.map_to_local(pos[index]))
	
	# 生成格子
	# 用于显示
	var index = sce.select_manage.show_range(
		lpos,
		SceneSelectManage.SelectMangerMode.SKILL,
		call_check,
		_args
	)[0]
	# 需要获取 index 来判断一下
	# 1. 这个技能不能位移到墙里面去
	# 2、 这个技能不能位移到有单位的地方
	# 遍历，并删掉多余的区域
	var areas: Array = sce.select_manage.get_layer_index(index)["areas"]
	for i in range(areas.size() - 1, -1, -1): # 从末尾开始遍历
		var a = areas[i]
		# 先判断区域
		var cell: Dictionary = sce.map.get_position_call_top_info(a.position)
		if not cell["is_stay"]:
			areas.remove_at(i)
			a.queue_free()
			continue # 进行下一次遍历
		# 判断unit
		var unit: Array[Unit] = sce.unit_manage.get_position_units([a.position])
		if not unit.is_empty():
			areas.remove_at(i)
			a.queue_free()




func call_check(_args: Dictionary) -> bool:
	# 因为是要位移的
	# 所以我们需要判断一下 target_position 这个属性
	# 这个属性在地图上的属性如果是[不能停留]的地方
	# 就返回 false
	var tp: Vector2 = _args["target_position"]
	var sc: Scene = get_scene()
	# 关于 cell 的属性，cell的例子：
	# src/scene/modules/map/modules/scene_map_tile_set.gd
	var cell: Dictionary = sc.map.get_position_call_top_info(tp)
	# 判断是否可停留
	# is_stay 是一个 bool 值
	if cell["is_stay"]:
		target_position = tp
		phase = false # 在开始前先设置一下阶段
		_run()
		phase = true # 进入下一阶段
		return true # 返回true让 select-manage 清除掉这些图块
	return false




func cost() -> bool:
	if not is_instance_valid(master):
		return false;
	
	# 因为效果的父节点是 UnitSkill
	# 所以访问 Unit 的 master 来获取 unit
	var property: UnitProperty = get_master_unit().property
	if  property.action_chance >= cost_action_chance and \
		property.move_chance >= cost_move_chance and \
		property.current_ep >= cost_ep:
		return true
		
	return false




func _run() -> void:
	if not phase:
		var gmu: Unit = get_master_unit()
		# 支付代价
		gmu.property.action_chance -= cost_action_chance
		gmu.property.move_chance -= cost_move_chance
		gmu.property.current_ep -= cost_ep
		
		# 技能位移动画
		var tween: Tween = get_tree().create_tween()
		tween.tween_property(gmu, "global_position", target_position, 0.125)
		
		# 重置技能时效
		time = 0
	else:
		target_harm["harm"] += harm_up




## 这个技能在第二阶段时
## 需要监测战斗调用
## 同时还有需要验证技能的时效
func auto(_args: Dictionary = {}) -> void:
	if phase:
		if  _args["class"] == "ATTACK" and \
			_args["state"] == "START":
			
			target_harm = _args
			_run()
			phase = false
		
		# 效果时效
		elif _args["class"] == "ROUND_END":
			time += 1
			# 如果已经超时，就重置技能
			if time > 1:
				time = 0
				phase = false
			pass
